<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    //1.字符串的两种创建方式（字面量和构建函数）
    //1-1.构建函数
    // var str1 = new String('hello')     // 字符串对象，系统自动创建
    // console.log(str1)               //String {"hello"}
    // console.log(typeof str1)        //object
    //1-2.字面量
    // var str2 = 'hello'
    // console.log(str1 == str2)         //true
    //1-3.字符串属于类数组
    //类数组也叫伪数组，在js中有一些对象也有length属性，且拥有为非负整数的属性[索引]，但是他不能调用数组的方法，叫做类数组对象
    // var str2 = 'hello'
    // console.log(str2.length)        //5
    // console.log(str2[0])            //h
    // str2.length = 10
    // console.log(str2.length)        //5


    //2.为什么基本类型拥有属性和方法
    // 包装对象：具有临时性，number、string、Boolean叫做包装对象，当使用基本类型的属性和方法的时候，系统会临时将基本类型转换成对象方式进行创建，属性和方法使用完成，自动销毁。
    // var str = 'javascript'  //包装对象
    // str.length = 5            //系统临时创建对象，使用完自动销毁
    // console.log(str.length)          //10


    // var a = 5
    // a.b = 3
    // console.log(a.b)       ///undefined


    // var c = [1, 2, 3, 4, 5]
    // c.d = 6
    // console.log(c.d)         //   6
    // console.log(c)          //  (5) [1, 2, 3, 4, 5, d: 6]



    //字符串的方法
    //1.charAt(Num):返回对象字符串索引的内容,与索引的效果相同
    // var str = 'javascript'
    // // console.log(str.charAt(1))     //a
    // // console.log(str[1])            //a

    //2.charCodeAt(num):返回对应的字符串索引内容的Unicode编码
    // console.log(str.charCodeAt(3))     //97    小写a的编码是97

    // var str1 = 'nihao你好'
    // for (i = 0; i < str1.length; i++) {
    //     console.log(str1.charCodeAt(i))
    // }
    //Unicode编码  0-9   48-57    A-Z    65-90    a-z   97-122

    //3.String.fromCharCode(unicode编码)  将参数中的unicode编码返回成对应的字符串的内容，多个编码用逗号分隔。
    // console.log(String.fromCharCode(20320, 22909))    //你好
    // for (i = 0; i < 1000; i++) {
    //     document.write(String.fromCharCode(i))
    // }


    //4.trim()创建一个字符串的副本，删除前置及后缀的所有空格，然后返回结果
    // var str = '   cdise   ndhsv vdkjslB hdsilha   '
    // console.log(str)              //   cdise   ndhsv vdkjslB hdsilha   
    // console.log(str.trim())       //cdise   ndhsv vdkjslB hdsilha

    //***5.split()——根据分隔符、将字符串拆分成数组
    //把一个字符串分割成一个数组。通过传递一个参数来分割。第一个参数就是分割字符串的符号。如果参数为空，也是数组，只有一个数据。第二个参数用来限制数组的长度，多余的切掉。
    var str = 'javascript'
    // console.log(str.split())                //["javascript"]   变成一个数组，数组中只有一项
    // console.log(str.split('s'))             //(2) ["java", "cript"]   变成一个数组，用s将字符串分割成两项数组项，用逗号分开,s变成了逗号
    // console.log(str.split('a'))             //(3) ["j", "v", "script"]  三项，a转成了逗号
    // console.log(str.split(''))               //(10) ["j", "a", "v", "a", "s", "c", "r", "i", "p", "t"]  ,用空隙分割
    // console.log(str.split(','))             //["javascript"]   得到的结果不是用逗号分割的数组项，因为字符串中没有逗号
    // console.log(str.split('', 6))            //(6) ["j", "a", "v", "a", "s", "c"]   只保留了6项
    // console.log(str.split(' '))                 //["javascript"]
    // console.log(str.split('r', 4))               // ["javasc", "ipt"]  只有两项，不能限制为四项
    //将var str = 'javascript'  变成 'tpircsavaj'
    // var newarr = str.split('')
    // console.log(newarr.reverse().join(''))   //tpircsavaj
    // console.log(newarr.join(''))     //tpircsavaj
    // console.log(str.split('').reverse().join(''))     //tpircsavaj

    //数组扁平化  将多维数组转化成一维数组
    // var arr = [1, [2, [3, [4, 5, [6, 7, 8, [9, 10]]]]]]
    // console.log(arr.join(''))        //12,3,4,5,6,7,8,9,10
    // console.log(arr.join(','))       //1,2,3,4,5,6,7,8,9,10
    // console.log(arr.join(',').split(''))
    // //(20) ["1", ",", "2", ",", "3", ",", "4", ",", "5", ",", "6", ",", "7", ",", "8", ",", "9", ",", "1", "0"]
    // console.log(arr.join(',').split(','))   //(10) ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
    // console.log(arr.join(',').split(',').map(function (value, index, arry) {
    //     return +value
    // }))                                   //(10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


    //数组下面flat方法可以直接做扁平化，参数就是我扁平的维数
    // console.log(arr.flat(6))               //(10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    // console.log(arr.flat(Infinity))        //(10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


    //有十几种可以做扁平化，递归也可以


    // //6.substring:截取字符串。   没有参数全部截取，参数1：起始位置，参数2：结束位置（不包括结束位置） 都是索引数字
    // console.log(str.substring())     //javascript
    // console.log(str.substring(4))     //script
    // console.log(str.substring(2, 5))   //vas
    // console.log(str.substring(6, 2))   //vasc    如果前面的数比后面的大，自动交换位置
    // console.log(str.substring(4, -4))  //java     如果是有参数是负值，转换成0，4比0大，再交换位置，就是0,4
    // console.log(str.substring(4, 0))   //java
    // console.log(str.substring(0, 4))   //java
    // console.log(str)

    //7.substr(start,length)  ,用来截取字符串的内容  start:开始的索引，如果为负数，从后往前数位置，包括开始的索引
    console.log(str.substr(-2, 5))    //pt      从-2的位置开始截取，后面只有两位 所以结果就是pt
    console.log(str.substr(-7, 3))    //asc
    console.log(str)

    //8.toUpperCase()  字符串转大写字母
    //9.toLowerCase()  字符串转小写字母
    // var strD = 'DJBAVBDJKSKLBV'
    // console.log(str.toUpperCase())   //JAVASCRIPT
    // console.log(strD.toLowerCase())   //djbavbdjksklbv

    //字符串的其他方法再正则表达式中继续讲解
    //10.replace：替换匹配到的数据，两个参数，1代表正则，2代表用来替换的字符
    //   match：获取匹配的结果，返回数组
    //   search:用来查找匹配数据，和全局没有关系，查找第一个匹配值得位置  索引值


    //数组和字符串共有的方法：
    // slice() 截取字符串的方法，如果为负数，从后往前进行截取，包括开始的索引。   与数组的截取用法一样
    // console.log(str.slice(2, -4))    //vasc         
    // indexOf和lastIndexOf():区别是如果第二个参数为负数，数组是从后往前找，字符串是当做0处理。  两个参数：要找分项，找的开始位置


    //数组
    // var arr = ['a', 'b', 'c', 'd', 'b']
    // console.log(arr.indexOf('b', 2))         //4
    // console.log(arr.indexOf('b', -5))        //1

    //字符串
    // console.log(str.indexOf('a'))       //1
    // console.log(str.indexOf('a', 2))   //3
    // console.log(str.indexOf('a', -5))   //1        负数当0处理

    // concat( )：和数组方法使用一致。  在后面追加
    // console.log(str.concat('真难学', '太难了'))
    // console.log(str)
    // // includes( ) : 和数组方法使用一致。   判断是否存在，输出true or false
    // console.log(str.includes('s'))    //true
</script>